    package com.nas.crocus.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.nas.crocus.domain.Evento;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.RegistroPasajero;
import com.nas.crocus.exception.CrocusException;
import com.nas.crocus.exception.EntidadNoUnicaException;
import com.nas.crocus.exception.NotFoundException;
import com.nas.crocus.exception.PrecondicionNoCumplidaException;
import com.nas.crocus.service.PasajeroService;
import com.nas.crocus.service.RegistroPasajeroService;


@Controller
@RequestMapping(value = "/registroPasajero")
public class RegistroPasajeroController {
    
    @Autowired
    private PasajeroService pasajeroService; 
    
    @Autowired
    private RegistroPasajeroService registroPasajeroService;
    
    @RequestMapping(value = "evento/id/{eventoId}", method = RequestMethod.GET)
    public @ResponseBody RegistroPasajero obtenerPorEventoId(@PathVariable Long eventoId) throws NotFoundException {
        RegistroPasajero registroPasajero = registroPasajeroService.obtenerPorEventoId(eventoId);
        Evento evento = new Evento();
        evento.setId(eventoId);
        registroPasajero.setEvento(evento);
        
        Collection<Pasajero> acompaniantes = new ArrayList<Pasajero>();
        for (Pasajero pasajero : registroPasajero.getPasajeros()) {
            pasajero.setRegistroPasajero(null);
            pasajero.setAcompaniantes(acompaniantes);
        }
        
        return registroPasajero;
    }
        
    @RequestMapping(value ="evento/id/{eventoId}/pasajero/miembro", method = RequestMethod.GET)
    public @ResponseBody Collection<Pasajero> buscarMiembro(@PathVariable Long eventoId, @RequestParam("term") String term) {
        Collection<Pasajero> pasajeros = registroPasajeroService.buscarMiembroPorPatronApellidoNombreNumeroDocumento(eventoId, term);
        ArrayList<Pasajero> acompaniantes = new ArrayList<Pasajero>();        
        for (Pasajero pasajero : pasajeros) {
            pasajero.setRegistroPasajero(null);
            pasajero.setAcompanianteDe(null);
            pasajero.setAcompaniantes(acompaniantes);
        }
        return pasajeros;
    }
    
    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public @ResponseBody Pasajero crear(@RequestBody Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        Long eventoId = pasajero.getRegistroPasajero().getEvento().getId();
        registroPasajeroService.registrarPasajero(eventoId, pasajero);
        Evento evento = new Evento();
        evento.setId(eventoId);
        pasajero.getRegistroPasajero().setEvento(evento);
        pasajero.getRegistroPasajero().setPasajeros(new ArrayList<Pasajero>());
        if (pasajero.getAcompanianteDe() != null) {
            pasajero.getAcompanianteDe().setAcompaniantes(new ArrayList<Pasajero>());
        }
        return pasajero;
    }
    

    @RequestMapping(method = RequestMethod.PUT)
    public @ResponseBody Pasajero actualizar(@RequestBody Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        Long eventoId = pasajero.getRegistroPasajero().getEvento().getId();
        pasajeroService.actualizar(pasajero);
        Evento evento = new Evento();
        evento.setId(eventoId);
        pasajero.getRegistroPasajero().setEvento(evento);
        pasajero.getRegistroPasajero().setPasajeros(new ArrayList<Pasajero>());
        if (pasajero.getAcompanianteDe() != null) {
            pasajero.getAcompanianteDe().setAcompaniantes(new ArrayList<Pasajero>());
        }
        return pasajero;
    }
    
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NotFoundException.class)
    public @ResponseBody Map<String, String> handleException(NotFoundException ex) {
        Map<String, String> fault = new HashMap<String, String>();
        fault.put("error", ex.getMensaje());
        return fault;
    }
    
    @ResponseStatus(HttpStatus.PRECONDITION_FAILED)
    @ExceptionHandler({EntidadNoUnicaException.class, PrecondicionNoCumplidaException.class})
    public @ResponseBody Map<String, String> handleException(CrocusException ex) {
        Map<String, String> fault = new HashMap<String, String>();
        fault.put("error", ex.getMensaje());
        return fault;

    }
}
